package com.sisgesbyte.web.managedBean.proyeccion;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.context.FacesContext;
import javax.servlet.http.HttpSession;

import org.primefaces.event.SelectEvent;

import com.sisgesbyte.common.ConstantesInternasSistema;
import com.sisgesbyte.dao.beanDao.FiltrosBean;
import com.sisgesbyte.dao.beanDao.FiltrosSQLBean;
import com.sisgesbyte.services.administracion.MantenimientoCategoriaCliente;
import com.sisgesbyte.services.administracion.MantenimientoCategoriaProd;
import com.sisgesbyte.services.administracion.bean.CategoriaClienteBean;
import com.sisgesbyte.services.administracion.bean.CategoriaClienteListaRes;
import com.sisgesbyte.services.administracion.bean.CategoriaProdBean;
import com.sisgesbyte.services.administracion.bean.CategoriaProdListaResponse;
import com.sisgesbyte.services.administracion.bean.ZonaBean;
import com.sisgesbyte.services.proyeccion.ProyeccionClienteService;
import com.sisgesbyte.services.proyeccion.ProyeccionFfVvService;
import com.sisgesbyte.services.proyeccion.bean.AvanceProyeccionClienteResponse;
import com.sisgesbyte.services.proyeccion.bean.AvanceProyeccionProductResponse;
import com.sisgesbyte.services.proyeccion.bean.AvanceVentaProductosBean;
import com.sisgesbyte.services.proyeccion.bean.FiltroProyClienteBean;
import com.sisgesbyte.services.proyeccion.bean.ProyeccionClienteBean;
import com.sisgesbyte.services.ventas.MantenimientoFFVVService;
import com.sisgesbyte.services.ventas.MantenimientoPeriodo;
import com.sisgesbyte.services.ventas.MantenimientoZona;
import com.sisgesbyte.services.ventas.bean.FFVVBean;
import com.sisgesbyte.services.ventas.bean.ListaFFVVJerarquiaResponse;
import com.sisgesbyte.services.ventas.bean.PeriodoBean;
import com.sisgesbyte.services.ventas.bean.PeriodoListaBean;
import com.sisgesbyte.services.ventas.bean.ZonaListaResponse;

@ManagedBean
@ViewScoped
public class ProyeccionClientesMBean implements Serializable {

	private static final long serialVersionUID = 1L;
	@EJB
	private ProyeccionFfVvService proyeccionFfVvService;
	@EJB
	private MantenimientoPeriodo mantenimientoPeriodo;
	@EJB
	private MantenimientoZona mantenimientoZona;
	@EJB
	private MantenimientoCategoriaCliente mantenimientoCategoriaCliente;
	@EJB
	private MantenimientoFFVVService mantenimientoFFVVService;
	@EJB
	private ProyeccionClienteService proyeccionClienteService;
	@EJB
	private MantenimientoCategoriaProd mantenimientoCategoriaProd;
	// variables para proyeccion productos
	private List<AvanceVentaProductosBean> listaProductosCliente;
	private List<CategoriaProdBean> listaCategoriaProductos;
	private List<CategoriaProdBean> listaCategoriaProductosPadres;
	private List<CategoriaProdBean> listaCategoriaProductosHijos;
	private String txtBuscar;
	private int idCategoriaProducto;
	private List<AvanceVentaProductosBean> listaProductos;
	private List<AvanceVentaProductosBean> listaProductosTemporal;
	private List<CategoriaProdBean> categoriaHijos;
	// -------

	private List<CategoriaClienteBean> listaCanales;
	private Integer periodoDefault;
	private List<PeriodoBean> listaPeriodos;
	private List<ZonaBean> listaZonas;
	private List<FFVVBean> listaFFVV;
	private List<ProyeccionClienteBean> listaCliente;
	private int idZona;
	private int idCanal;
	private int idFfvv;
	private ProyeccionClienteBean selectedCliente;
	private Boolean bloquear;
	
	@PostConstruct
	public void init() {
		setBloquear(true);
		cargarPeriodos();
		mostrarPeriodoDefault();
		cargarZonas();
		cargarCanales();
		cargarFFVV();
		inicializar();
		txtBuscar = "";
		cargarCategorias();
		categoriaHijos = new ArrayList<CategoriaProdBean>();
	}

	public void inicializar() {
		setBloquear(true);
		FiltroProyClienteBean filtros = new FiltroProyClienteBean();
		filtros.setIdPeriodo(periodoDefault);
		filtros.setIdZona(idZona);
		filtros.setIdCanal(idCanal);
		filtros.setIdFFVV(idFfvv);
		AvanceProyeccionClienteResponse clientes = null;
		try {
			clientes = proyeccionClienteService.listaAvanceClientes(
					ObtenerIdTransaccion(), filtros);
		} catch (Exception e) {
			System.out.println("Error al obtener los avance de los Clientes "
					+ e.getMessage());
		}
		this.listaCliente = new ArrayList<ProyeccionClienteBean>();
		if (clientes.getCodigoRespuesta().equalsIgnoreCase(
				ConstantesInternasSistema.CODIGO_EXITO)) {
			this.listaCliente = clientes.getListaAvanceCliente();
		}

	}

	public void buscarProductosAvance() {
		try {
			FiltroProyClienteBean filtros = new FiltroProyClienteBean();
			filtros.setIdCliente(selectedCliente.getIdCliente());
			filtros.setIdPeriodo(periodoDefault);

			AvanceProyeccionProductResponse listaProductosZona = proyeccionClienteService
					.avanceProductosCliente(ObtenerIdTransaccion(), filtros);
			this.listaProductos = new ArrayList<AvanceVentaProductosBean>();

			if (listaProductosZona.getCodigoRespuesta().equalsIgnoreCase(
					ConstantesInternasSistema.CODIGO_EXITO)) {
				this.listaProductos = listaProductosZona
						.getListaProductosZonas();
				// variable temporal para los productos y poder aplicarles
				// filtro
				this.listaProductosTemporal = this.listaProductos;
			} else {
				System.out.println("Error al obtener los productos");
			}
		} catch (Exception e) {
			System.out
					.println("Error al obtener la lista de productos por zona "
							+ e.getMessage());
		}
	}

	public void cargarCategorias() {
		try {

			CategoriaProdListaResponse categorias = mantenimientoCategoriaProd
					.listaCategoriasProducto(ObtenerIdTransaccion(), null);
			listaCategoriaProductos = new ArrayList<CategoriaProdBean>();
			listaCategoriaProductosPadres = new ArrayList<CategoriaProdBean>();
			listaCategoriaProductosHijos = new ArrayList<CategoriaProdBean>();
			for (CategoriaProdBean ls : categorias.getListaCategoriaProductos()) {
				if (ls.getPadre_id() == 0) {
					listaCategoriaProductosPadres.add(ls);
				} else {
					listaCategoriaProductosHijos.add(ls);
				}
			}

			for (CategoriaProdBean ls : listaCategoriaProductosPadres) {
				listaCategoriaProductos.add(ls);
				mostrarHijos(ls.getId());
			}
		} catch (Exception e) {
			System.out.println("Error al cargar las categorias: " + e);
		}
	}

	public void cargarPeriodos() {
		try {
			PeriodoListaBean periodos = mantenimientoPeriodo
					.listaPeriodos(ObtenerIdTransaccion());
			this.listaPeriodos = periodos.getListaPeriodos();
		} catch (Exception e) {
			System.out.println("Error al cargar los periodos: " + e);
		}
	}

	public void mostrarPeriodoDefault() {
		for (PeriodoBean ls : getListaPeriodos()) {
			if (ls.getDefecto() != null && ls.getDefecto() == true) {
				setPeriodoDefault(ls.getId());
			}
		}
	}

	public void cargarZonas() {
		try {
			FiltrosSQLBean filtro = new FiltrosSQLBean();
			List<FiltrosBean> listaFiltros = new ArrayList<FiltrosBean>();
			List<Object> valores = new ArrayList<Object>();

			// ffvv activo
			FiltrosBean ffvvActive = new FiltrosBean();
			List<String> camposActive = new ArrayList<String>();
			camposActive.add("active");
			ffvvActive.setCampos(camposActive);
			ffvvActive.setOperador("=");
			listaFiltros.add(ffvvActive);
			valores.add(true);

			filtro.setListaFiltros(listaFiltros);
			filtro.setListaValores(valores);
			this.listaZonas = new ArrayList<ZonaBean>();
			ZonaListaResponse zonas = mantenimientoZona.listaZonas(
					ObtenerIdTransaccion(), filtro);
			if (zonas.getCodigoRespuesta().equalsIgnoreCase(
					ConstantesInternasSistema.CODIGO_EXITO)) {
				this.listaZonas = zonas.getListaZonas();
			}

		} catch (Exception e) {
			System.out.println("Error al obtener las zonas: " + e);
		}
	}

	public void cargarCanales() {
		try {
			FiltrosSQLBean filtro = new FiltrosSQLBean();
			List<FiltrosBean> listaFiltros = new ArrayList<FiltrosBean>();
			FiltrosBean filtroCampos = new FiltrosBean();
			List<String> campos = new ArrayList<String>();
			campos.add("active");
			filtroCampos.setCampos(campos);
			filtroCampos.setOperador("=");
			listaFiltros.add(filtroCampos);
			List<Object> valores = new ArrayList<Object>();
			valores.add(true);
			filtro.setListaFiltros(listaFiltros);
			filtro.setListaValores(valores);
			CategoriaClienteListaRes canales = mantenimientoCategoriaCliente
					.listaCategoriaCliente(ObtenerIdTransaccion(), filtro);
			if (canales.getCodigoRespuesta().equalsIgnoreCase(
					ConstantesInternasSistema.CODIGO_EXITO)) {
				this.listaCanales = canales.getListaCategoriaCliente();
			}

		} catch (Exception e) {
			System.out.println("Error al obtener los canales: " + e);
		}
	}

	public void cargarFFVV() {
		try {
			FiltrosSQLBean filtro = new FiltrosSQLBean();
			List<FiltrosBean> listaFiltros = new ArrayList<FiltrosBean>();
			List<Object> valores = new ArrayList<Object>();

			FiltrosBean filtroCampos = new FiltrosBean();
			List<String> campos = new ArrayList<String>();
			campos.add("ee.active");
			filtroCampos.setCampos(campos);
			filtroCampos.setOperador("=");
			listaFiltros.add(filtroCampos);
			valores.add(true);

			if (idZona > 0) {
				// filtro por zona
				FiltrosBean filtroZona = new FiltrosBean();
				List<String> camposZona = new ArrayList<String>();
				camposZona.add("ee.zona_id");
				filtroZona.setCampos(camposZona);
				filtroZona.setOperador("=");
				listaFiltros.add(filtroZona);
				valores.add(idZona);
			}

			if (idCanal > 0) {
				// filtro por canal
				FiltrosBean filtroCanal = new FiltrosBean();
				List<String> camposCanal = new ArrayList<String>();
				camposCanal.add("ee.categoria_cliente_id");
				filtroCanal.setCampos(camposCanal);
				filtroCanal.setOperador("=");
				listaFiltros.add(filtroCanal);
				valores.add(idCanal);
			}

			filtro.setListaFiltros(listaFiltros);
			filtro.setListaValores(valores);
			ListaFFVVJerarquiaResponse ffvvLista = mantenimientoFFVVService
					.listaFFVV(ObtenerIdTransaccion(), filtro);
			this.listaFFVV = new ArrayList<FFVVBean>();
			if (ffvvLista.getCodigoRespuesta().equalsIgnoreCase(
					ConstantesInternasSistema.CODIGO_EXITO)) {
				this.listaFFVV = ffvvLista.getListaJerarquiaFFVV();
			}

		} catch (Exception e) {
			System.out.println("Error al Obtener la FFVV " + e.getMessage());
		}
	}

	// metodo para obtener la estructura de hijos de una categoria
	public void mostrarHijos(int padreId) {

		for (CategoriaProdBean ls : listaCategoriaProductosHijos) {
			if (padreId == ls.getPadre_id()) {
				listaCategoriaProductos.add(ls);
				mostrarHijos(ls.getId());
			}
		}
	}

	public void obtenerCategoriaHijos(int idPadre) {

		for (CategoriaProdBean ls : listaCategoriaProductos) {
			if (idPadre == ls.getPadre_id()) {
				categoriaHijos.add(ls);
				obtenerCategoriaHijos(ls.getId());
			}
		}
	}

	public void crearFiltro() {
		categoriaHijos = new ArrayList<CategoriaProdBean>();
		this.listaProductosTemporal = new ArrayList<AvanceVentaProductosBean>();

		// buscamos al padre
		for (CategoriaProdBean ls : listaCategoriaProductos) {
			if (idCategoriaProducto == ls.getId()) {
				categoriaHijos.add(ls);
			}
		}
		// buscamos los hijos
		obtenerCategoriaHijos(idCategoriaProducto);

		// recorremos las categorias
		for (CategoriaProdBean cat : categoriaHijos) {
			// buscamos los productos por categoria
			for (AvanceVentaProductosBean prod : listaProductos) {
				if (prod.getCategoriaProductoId() == cat.getId()
						&& (prod.getMarca() + " / " + prod.getProducto()
								+ " / " + prod.getCodProd()).toLowerCase()
								.contains(txtBuscar.toLowerCase().trim())) {
					this.listaProductosTemporal.add(prod);
				}
			}
		}
	}

	public void onRowSelect(SelectEvent event) {
		setBloquear(false);
		ProyeccionClienteBean selected = (ProyeccionClienteBean)event.getObject();
		this.selectedCliente=selected;
		buscarProductosAvance();
	}

	public String ObtenerIdTransaccion() {
		String sessionId = "";
		try {
			FacesContext fCtx = FacesContext.getCurrentInstance();
			HttpSession session = (HttpSession) fCtx.getExternalContext()
					.getSession(false);
			sessionId = session.getId().replace(".undefined", "");
		} catch (Exception e) {
			sessionId = "Error";
			System.out.println("Error al obtener Session" + e);
		}
		return sessionId;
	}

	public List<CategoriaClienteBean> getListaCanales() {
		return listaCanales;
	}

	public void setListaCanales(List<CategoriaClienteBean> listaCanales) {
		this.listaCanales = listaCanales;
	}

	public Integer getPeriodoDefault() {
		return periodoDefault;
	}

	public void setPeriodoDefault(Integer periodoDefault) {
		this.periodoDefault = periodoDefault;
	}

	public List<PeriodoBean> getListaPeriodos() {
		return listaPeriodos;
	}

	public void setListaPeriodos(List<PeriodoBean> listaPeriodos) {
		this.listaPeriodos = listaPeriodos;
	}

	public List<ZonaBean> getListaZonas() {
		return listaZonas;
	}

	public void setListaZonas(List<ZonaBean> listaZonas) {
		this.listaZonas = listaZonas;
	}

	public int getIdZona() {
		return idZona;
	}

	public void setIdZona(int idZona) {
		this.idZona = idZona;
	}

	public int getIdCanal() {
		return idCanal;
	}

	public void setIdCanal(int idCanal) {
		this.idCanal = idCanal;
	}

	public List<FFVVBean> getListaFFVV() {
		return listaFFVV;
	}

	public void setListaFFVV(List<FFVVBean> listaFFVV) {
		this.listaFFVV = listaFFVV;
	}

	public int getIdFfvv() {
		return idFfvv;
	}

	public void setIdFfvv(int idFfvv) {
		this.idFfvv = idFfvv;
	}

	public List<ProyeccionClienteBean> getListaCliente() {
		return listaCliente;
	}

	public void setListaCliente(List<ProyeccionClienteBean> listaCliente) {
		this.listaCliente = listaCliente;
	}

	public List<CategoriaProdBean> getListaCategoriaProductos() {
		return listaCategoriaProductos;
	}

	public void setListaCategoriaProductos(
			List<CategoriaProdBean> listaCategoriaProductos) {
		this.listaCategoriaProductos = listaCategoriaProductos;
	}

	public String getTxtBuscar() {
		return txtBuscar;
	}

	public void setTxtBuscar(String txtBuscar) {
		this.txtBuscar = txtBuscar;
	}

	public int getIdCategoriaProducto() {
		return idCategoriaProducto;
	}

	public void setIdCategoriaProducto(int idCategoriaProducto) {
		this.idCategoriaProducto = idCategoriaProducto;
	}

	public List<AvanceVentaProductosBean> getListaProductos() {
		return listaProductos;
	}

	public void setListaProductos(List<AvanceVentaProductosBean> listaProductos) {
		this.listaProductos = listaProductos;
	}

	public List<AvanceVentaProductosBean> getListaProductosTemporal() {
		return listaProductosTemporal;
	}

	public void setListaProductosTemporal(
			List<AvanceVentaProductosBean> listaProductosTemporal) {
		this.listaProductosTemporal = listaProductosTemporal;
	}

	public List<AvanceVentaProductosBean> getListaProductosCliente() {
		return listaProductosCliente;
	}

	public void setListaProductosCliente(
			List<AvanceVentaProductosBean> listaProductosCliente) {
		this.listaProductosCliente = listaProductosCliente;
	}

	public ProyeccionClienteBean getSelectedCliente() {
		return selectedCliente;
	}

	public void setSelectedCliente(ProyeccionClienteBean selectedCliente) {
		this.selectedCliente = selectedCliente;
	}

	public Boolean getBloquear() {
		return bloquear;
	}

	public void setBloquear(Boolean bloquear) {
		this.bloquear = bloquear;
	}

}
